package com.bookrecomm.controller;

import com.bookrecomm.entity.Comment;
import com.bookrecomm.service.CommentService;
import com.bookrecomm.vo.CommentVO;
import com.bookrecomm.vo.PageVO;
import com.bookrecomm.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * 评论控制器
 * 处理图书评论相关的请求
 */
@RestController
@RequestMapping("/comments")
public class CommentController {

    @Autowired
    private CommentService commentService;

    /**
     * 根据ID查询评论
     * @param id 评论ID
     * @return 评论信息
     */
    @GetMapping("/{id}")
    public ResultVO<CommentVO> getCommentById(@PathVariable Long id) {
        CommentVO commentVO = commentService.findById(id);
        return ResultVO.success("获取成功", commentVO);
    }

    /**
     * 根据图书ID查询评论列表
     * @param bookId 图书ID
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @param sort 排序字段
     * @param order 排序方向（asc/desc）
     * @return 分页评论列表
     */
    @GetMapping("/book/{bookId}")
    public ResultVO<PageVO<CommentVO>> getCommentsByBookId(
            @PathVariable Long bookId,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size,
            @RequestParam(defaultValue = "createdAt") String sort,
            @RequestParam(defaultValue = "desc") String order) {
        
        // 创建分页参数
        Sort.Direction direction = "asc".equalsIgnoreCase(order) ? Sort.Direction.ASC : Sort.Direction.DESC;
        Pageable pageable = PageRequest.of(page - 1, size, Sort.by(direction, sort));
        
        // 查询评论列表
        PageVO<CommentVO> pageVO = commentService.findByBookId(bookId, pageable);
        return ResultVO.success("获取成功", pageVO);
    }

    /**
     * 根据用户ID查询评论列表
     * @param userId 用户ID
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @return 分页评论列表
     */
    @GetMapping("/user/{userId}")
    public ResultVO<PageVO<CommentVO>> getCommentsByUserId(
            @PathVariable Long userId,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size) {
        
        // 创建分页参数
        Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "createdAt"));
        
        // 查询评论列表
        PageVO<CommentVO> pageVO = commentService.findByUserId(userId, pageable);
        return ResultVO.success("获取成功", pageVO);
    }

    /**
     * 添加评论（需要登录）
     * @param comment 评论信息
     * @return 添加后的评论信息
     */
    @PostMapping
    @PreAuthorize("isAuthenticated()")
    public ResultVO<CommentVO> addComment(@Valid @RequestBody Comment comment) {
        CommentVO commentVO = commentService.addComment(comment);
        return ResultVO.success("添加成功", commentVO);
    }

    /**
     * 回复评论（需要登录）
     * @param parentId 父评论ID
     * @param comment 评论信息
     * @return 添加后的评论信息
     */
    @PostMapping("/{parentId}/reply")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<CommentVO> replyComment(
            @PathVariable Long parentId,
            @Valid @RequestBody Comment comment) {
        
        CommentVO commentVO = commentService.replyComment(parentId, comment);
        return ResultVO.success("回复成功", commentVO);
    }

    /**
     * 更新评论（需要是评论作者或管理员）
     * @param id 评论ID
     * @param comment 评论信息
     * @return 更新后的评论信息
     */
    @PutMapping("/{id}")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<CommentVO> updateComment(
            @PathVariable Long id,
            @Valid @RequestBody Comment comment) {
        
        CommentVO commentVO = commentService.updateComment(id, comment);
        return ResultVO.success("更新成功", commentVO);
    }

    /**
     * 删除评论（需要是评论作者或管理员）
     * @param id 评论ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<Boolean> deleteComment(@PathVariable Long id) {
        boolean success = commentService.deleteComment(id);
        return ResultVO.success("删除成功", success);
    }

    /**
     * 点赞评论（需要登录）
     * @param id 评论ID
     * @return 更新后的评论信息
     */
    @PostMapping("/{id}/like")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<CommentVO> likeComment(@PathVariable Long id) {
        // 获取当前登录用户ID（在服务层中获取）
        CommentVO commentVO = commentService.likeComment(id, null);
        return ResultVO.success("点赞成功", commentVO);
    }

    /**
     * 取消点赞评论（需要登录）
     * @param id 评论ID
     * @return 更新后的评论信息
     */
    @PostMapping("/{id}/unlike")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<CommentVO> unlikeComment(@PathVariable Long id) {
        // 获取当前登录用户ID（在服务层中获取）
        CommentVO commentVO = commentService.unlikeComment(id, null);
        return ResultVO.success("取消点赞成功", commentVO);
    }
}
